// PPT解析工具 - 使用pptxtojson库解析PPT文件
// 动态导入pptxtojson库以避免ES模块兼容性问题

class PPTParser {
  constructor() {
    this.supportedTypes = ['.pptx', '.ppt']
  }

  // 检查文件类型是否支持
  isSupportedFile(file) {
    if (!file) return false
    const fileName = file.name.toLowerCase()
    return this.supportedTypes.some(type => fileName.endsWith(type))
  }

  // 解析PPT文件
  async parsePPT(file) {
    try {
      if (!this.isSupportedFile(file)) {
        throw new Error('不支持的文件类型，请选择 .pptx 或 .ppt 文件')
      }

      // 读取文件为ArrayBuffer
      const arrayBuffer = await this.readFileAsArrayBuffer(file)
      
      // 动态导入并使用pptxtojson解析
      const { parse } = await import('pptxtojson')
      const pptData = await parse(arrayBuffer)
      
      // 转换为系统兼容的格式
      const courseData = this.convertToSlides(pptData, file.name)
      
      return {
        success: true,
        data: courseData,
        message: `成功解析PPT文件，共${courseData.length}页`
      }
    } catch (error) {
      console.error('PPT解析失败:', error)
      return {
        success: false,
        data: null,
        message: `PPT解析失败: ${error.message}`
      }
    }
  }

  // 读取文件为ArrayBuffer
  readFileAsArrayBuffer(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader()
      reader.onload = e => resolve(e.target.result)
      reader.onerror = () => reject(new Error('文件读取失败'))
      reader.readAsArrayBuffer(file)
    })
  }

  // 转换PPT数据为系统slides格式
  convertToSlides(pptData, fileName) {
    const slides = []
    
    if (!pptData.slides || !Array.isArray(pptData.slides)) {
      throw new Error('PPT文件格式不正确')
    }

    pptData.slides.forEach((slide, index) => {
      const slideData = {
        id: `slide-${Date.now()}-${index}`,
        title: this.extractSlideTitle(slide, index),
        script: this.extractSlideText(slide),
        slideType: this.determineSlideType(slide),
        displayDuration: this.calculateDuration(slide),
        
        // 素材资源
        pptImage: this.extractSlideImage(slide),
        imageUrl: '',
        videoUrl: '',
        modelUrl: '',
        secondaryImageUrl: '',
        
        // 素材属性
        imagePosition: 'center',
        videoAutoplay: true,
        videoLoop: false,
        videoVolume: 80,
        modelScale: 1.0,
        modelRotation: { x: 0, y: 0, z: 0 },
        modelAnimation: '',
        
        // 布局设置
        layoutType: 'single',
        primarySize: 70,
        secondarySize: 30,
        
        // 视觉效果
        transition: 'fade',
        backgroundMusic: '',
        backgroundColor: this.extractBackgroundColor(slide),
        textColor: '#333333',
        fontSize: 16,
        fontWeight: 'normal',
        textAlign: 'left',
        
        // 镜头属性
        cameraShot: 'medium',
        cameraAngle: 'eye-level',
        cameraMovement: 'static',
        movementSpeed: 'normal',
        
        // 交互属性
        pausable: true,
        skippable: true,
        interactionHint: '',
        keywords: this.extractKeywords(slide),
        clickable: false,
        hoverEffect: false,
        
        // 高级属性
        effect3D: '',
        voiceType: 'female-professional',
        subtitles: '',
        subtitleStyle: 'bottom',
        notes: slide.note || '',
        showProperties: false,
        
        // 原始PPT数据（用于高级处理）
        originalData: slide
      }
      
      slides.push(slideData)
    })

    return slides
  }

  // 提取幻灯片标题
  extractSlideTitle(slide, index) {
    // 尝试从元素中找到标题
    if (slide.elements && slide.elements.length > 0) {
      // 查找文本元素作为标题
      const titleElement = slide.elements.find(element => 
        element.type === 'text' && 
        element.content && 
        element.content.length < 100 // 标题通常较短
      )
      
      if (titleElement) {
        // 提取纯文本（去除HTML标签）
        const title = this.stripHtmlTags(titleElement.content)
        if (title.trim()) {
          return title.trim()
        }
      }
    }
    
    return `幻灯片 ${index + 1}`
  }

  // 提取幻灯片文本内容
  extractSlideText(slide) {
    let allText = []
    
    if (slide.elements && slide.elements.length > 0) {
      slide.elements.forEach(element => {
        if (element.type === 'text' && element.content) {
          const text = this.stripHtmlTags(element.content)
          if (text.trim()) {
            allText.push(text.trim())
          }
        }
      })
    }
    
    // 如果有备注，也加入
    if (slide.note && slide.note.trim()) {
      allText.push(slide.note.trim())
    }
    
    return allText.join(' ')
  }

  // 确定幻灯片类型
  determineSlideType(slide) {
    if (!slide.elements || slide.elements.length === 0) {
      return 'title'
    }

    // 检查是否包含图片
    const hasImage = slide.elements.some(el => el.type === 'image')
    if (hasImage) {
      return 'image'
    }

    // 检查是否包含视频
    const hasVideo = slide.elements.some(el => el.type === 'video')
    if (hasVideo) {
      return 'video'
    }

    // 检查是否包含表格或图表
    const hasTable = slide.elements.some(el => el.type === 'table')
    const hasChart = slide.elements.some(el => el.type === 'chart')
    if (hasTable || hasChart) {
      return 'ppt'
    }

    // 默认为PPT页面
    return 'ppt'
  }

  // 计算显示时长
  calculateDuration(slide) {
    const textLength = this.extractSlideText(slide).length
    // 基于文字数量计算时长，每分钟150字
    const baseDuration = Math.max(15, Math.ceil(textLength / 2.5))
    return Math.min(baseDuration, 120) // 最长2分钟
  }

  // 提取幻灯片图片
  extractSlideImage(slide) {
    if (slide.elements && slide.elements.length > 0) {
      const imageElement = slide.elements.find(el => el.type === 'image' && el.src)
      if (imageElement) {
        return imageElement.src
      }
    }
    return ''
  }

  // 提取背景颜色
  extractBackgroundColor(slide) {
    if (slide.fill && slide.fill.type === 'color') {
      return slide.fill.value
    }
    return '#ffffff'
  }

  // 提取关键词
  extractKeywords(slide) {
    const text = this.extractSlideText(slide)
    // 简单的关键词提取（可以后续优化）
    const words = text.split(/\s+/)
      .filter(word => word.length > 2)
      .slice(0, 5) // 取前5个词作为关键词
    
    return words.join(',')
  }

  // 去除HTML标签
  stripHtmlTags(html) {
    if (!html) return ''
    return html.replace(/<[^>]*>/g, '').replace(/&nbsp;/g, ' ')
  }

  // 生成幻灯片预览图
  async generateSlidePreview(slide, width = 400, height = 300) {
    try {
      // 创建canvas
      const canvas = document.createElement('canvas')
      canvas.width = width
      canvas.height = height
      const ctx = canvas.getContext('2d')
      
      // 绘制背景
      ctx.fillStyle = this.extractBackgroundColor(slide)
      ctx.fillRect(0, 0, width, height)
      
      // 绘制文本（简化版）
      if (slide.elements && slide.elements.length > 0) {
        const textElements = slide.elements.filter(el => el.type === 'text')
        textElements.forEach((element, index) => {
          const text = this.stripHtmlTags(element.content)
          if (text) {
            ctx.fillStyle = '#333333'
            ctx.font = '16px Arial'
            ctx.fillText(text.substring(0, 50), 20, 50 + index * 30)
          }
        })
      }
      
      return canvas.toDataURL('image/png')
    } catch (error) {
      console.error('生成预览图失败:', error)
      return null
    }
  }

  // 获取PPT基本信息
  extractPPTInfo(pptData) {
    return {
      totalSlides: pptData.slides ? pptData.slides.length : 0,
      size: pptData.size || { width: 960, height: 540 },
      themeColors: pptData.themeColors || ['#4472C4', '#ED7D31', '#A5A5A5', '#FFC000', '#5B9BD5', '#70AD47']
    }
  }
}

// 创建全局实例
const pptParser = new PPTParser()

export default pptParser 